// 前两种算法, 可能还是不太美好, 所以看看是否有dp
// 换一个方式, 但与动规沾上边, 想象木板砌成的水池
// 水就是木料, 不停的提高最低水位
// 如果水不够, 就在半路上停下
// 如果水够, 那么就溢出

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let n,m;
let initArr = [];

rl.on("line", (line)=>{
    if(n === undefined) {
        [n, m] = line.trim().split(" ").map(Number);
    } else if (initArr.length === 0) {
        initArr = line.trim().split(" ").map(Number);
        const result = getResult(n, m, initArr)
        console.log(result)
        // 清理
        n = m = undefined;
        initArr.length = 0;
    }
})

/**
 *
 * @param n {number} 木板长度
 * @param m {number} 木料长度
 * @param initArr {[number]} 木板长度数据
 * @return {number}  最短木板长
 */
function getResult(n, m, initArr) {
    initArr.sort((a, b)=> a - b)
   let dp = 0; // 只有一块木板, 没有要补齐的下一块木板, 需要木料为0
    for (let i = 1; i < initArr.length; i++) {
        let need = (initArr[i] - initArr[i - 1]) * i
        if(dp + need > m) { // 木板不够了

            return  initArr[i - 1] + Math.floor((m - dp)/i);
        }
        dp += need;
    }

    return initArr[initArr.length - 1] + Math.floor((m - dp)/initArr.length);
}
